<?php
/**
 * Representa��o de um Processo Individual de Compra.
 * Um processo de compra � uma pedido que um setor/coordenadoria faz para a compra/contrata��o de algum material/servi�o.
 * Um processo de compra deve conter materiais ou servi�os da mesma categoria/servi�o, n�o sendo poss�vel pedir materiais e servi�os no mesmo processo.
 * Os Materiais/Servi�os contidos no detalhamento do Processo s�o adicionados a vari�vel $detalhamento, essa por sua vez � um array de objetos do tipo Detalhamento. 
 */

//if( !function_exists('__autoload') )
//{
 //   function __autoload($class_name) {
  //  require_once $class_name . '.php';
   // }
//}
require_once 'ProcessoDAO.php';
class Processo 
{
      private $id;                         // Chave-prim�ria do processo cadastrado no banco de dados
      private $fonte;                      // Objeto fonte do recurso associado ao processo
      private $licitacao;                  // Array bi-dimensional com a chave-prim�ria da licita��o cadastrada e com seu nome.
      private $informacoesAdicionaisLicitacao; //String descrevendo mais informações sobre a modalidade de licitação 
      private $objeto;                     // Descri��o geral do objeto da compra
//      private $objetivo;                   // Motivo da compra
	    private $fundamentoLegal;            // Lei a qual legaliza a compra
      private $justificativa;              // Raz�o da compra
//      private $garantias;                  // Rela��o das garantias dos produtos/servi�os
//      private $assistenciaTecnica;         // Informa��es sobre a assistencia tecnica dos produtos/servi�os
      private $infoRecebimento;            // Local onde a mercadoria deve ser entregue
      private $valorTotal;                 // Valor total da compra
      private $responsabilidadeIFAL;       // Rela��o das responsabilidades do IFAL
      private $responsabilidadeContratado; // Rela��o das responsabilidades do contratado
      private $sancoes;                    // Quais as san��es sofridas pelo contratado caso n�o seja cumprido o contrato
//      private $pagamento;                  // Como ser� feito o pagamento
      private $outrasInformacoes;          // Informa��es adcionais � compra
      private $responsavel;                // Objeto servidor que fez a solicita��o do processo. Respons�vel pela compra
      private $aprovador;                  // Pessoa que aprovar� a compra
      private $status;                     // Status do andamento do processo
      private $despacho;                   // Array de despachos realizados pelos diretores sobre o processo.
      private $protocolo;
      private $dataCriacao;
      private $dao;                        // Objeto para acesso ao banco de dados
      private $itens;                // Array de objetos Detalhamento com os materiais/servi�os deste processo.
      private $tipoProcesso;		// pode ser do tipo material ou servico	
      private $concluido;			//status 1 igual a processo conclu�do, igual a 0 processo em andamento
      
      public function __set( $var, $val )
      {
             $this->$var = $val;
      }

      public function __get( $var )
      {
             return $this->$var;
      }
      
      public function __construct( $id = NULL, $fonte = NULL, $licitacao = NULL, $objeto = NULL,
      							   /*$objetivo = NULL, */$fundamentoLegal = NULL, $justificativa = NULL,
                                  /* $garantias = NULL, $assistenciaTecnica = NULL,*/ $infoRecebimento = NULL, $valorTotal = NULL,
                                   $responsabilidadeIFAL = NULL, $responsabilidadeContratado = NULL, $sancoes = NULL, /*$pagamento = NULL,*/
                                   $outrasInformacoes = NULL, $responsavel = NULL, $aprovador = NULL, $status = NULL, $despacho = NULL,
                                   $protocolo = NULL, $dataCriacao = NULL, $itens = NULL, $tipoProcesso = NULL, $concluido = NULL,  $informacoesAdicionaisLicitacao = NULL)
      {

             $this->id = $id;
             $this->fonte = $fonte;
             $this->licitacao = $licitacao;
             $this->objeto = $objeto;
//           $this->objetivo = $objetivo;
             $this->fundamentoLegal = $fundamentoLegal;
             $this->justificativa = $justificativa;
//           $this->garantias = $garantias;
//           $this->assistenciaTecnica = $assistenciaTecnica;
             $this->infoRecebimento = $infoRecebimento;
             $this->valorTotal = $valorTotal;
             $this->responsabilidadeIFAL = $responsabilidadeIFAL;
             $this->responsabilidadeContratado = $responsabilidadeContratado;
             $this->sancoes = $sancoes;
//           $this->pagamento = $pagamento;
             $this->outrasInformacoes = $outrasInformacoes;
             $this->responsavel = $responsavel;
             $this->aprovador = $aprovador;
             $this->status = $status;
             $this->despacho = $despacho;
             $this->protocolo = $protocolo;
             $this->dataCriacao = $dataCriacao;
             $this->itens = $itens;
             $this->tipoProcesso = $tipoProcesso;
			 $this->concluido = $concluido;
			 $this->informacoesAdicionaisLicitacao = $informacoesAdicionaisLicitacao;	
             $this->dao = new ProcessoDAO();
      }

	public function setValorTotal()
	{
		$valorTotal = 0;
		for($i = 0; $i < count($this->itens); $i++ )
		{

			$valorTotal = $valorTotal + ((int)$this->itens[$i]->valor *  (int)$this->detalhamento->itens[$i]->quantidade);
		}
		$this->valorTotal = $valorTotal;
	}
      
	static public function ArrayParaObjetos( $array )
    {
		
    	if( !is_array( $array ) )
    		return FALSE;  	
		
		$objetos = Array();
      	for($i = 0; $i < count($array); $i++ )
      	{
      		$processo = new Processo();	
      		$processo->id = $array[$i]['id'];
      		$u = new Servidor();
            $responsavel = $u->CarregarServidor( $array[$i]['t_usuario_id'] );
            

      		if( $array[$i]['t_licitacao_id'] != 0 ) // O processo ainda n�o foi avaliado juridicamente
				$processo->licitacao = $processo->CarregarLicitacao( $array[$i]['t_licitacao_id'] );
            else
				$processo->licitacao = 0;    
			$processo->fonte = null;
      		$processo->informacoesAdicionaisLicitacao = $array[$i]['informacoes_adicionais_licitacao'];
			$processo->objeto = $array[$i]['objeto'];
//			$processo->objetivo = $array[$i]['objetivo'];
			$processo->fundamentoLegal = $array[$i]['fundamento_legal'];
			$processo->justificativa = $array[$i]['justificativa'];
//			$processo->garantias = $array[$i]['garantias'];
//			$processo->assistenciaTecnica = $array[$i]['assistencia_tecnica'];
			$processo->infoRecebimento = $array[$i]['info_recebimento'];
			$processo->valorTotal = $array[$i]['valor_total'];
			$processo->responsabilidadeIFAL = $array[$i]['responsabilidade_ifal'];
			$processo->responsabilidadeContratado = $array[$i]['responsabilidade_contratado'];
			$processo->sancoes = $array[$i]['sancoes'];
//			$processo->pagamento = $array[$i]['pagamento'];
			$processo->outrasInformacoes = $array[$i]['outras_informacoes'];
			$processo->responsavel = $responsavel;
			$processo->aprovador = $array[$i]['aprovo'];
			$processo->status = $array[$i]['status'];
			$processo->despacho = $processo->dao->CarregarDespacho( $processo->id );
			if( $array[$i]['protocolo'] == "" )
				$processo->protocolo = " - ";
			else
				$processo->protocolo = $array[$i]['protocolo'];
			$processo->dataCriacao = $array[$i]['data_criacao'];
			$processo->tipoProcesso = $array[$i]['processo_tipo'];
			
			
			if( $processo->tipoProcesso == 'material' )
			{
				$m = new Material();
				$itens = $m->CarregarMateriaisPorProcesso( $array[$i]['id'] );
			}
			else
			{
				$s = new Servico();
				$itens = $s->CarregarServicosPorProcesso( $array[$i]['id'] );
			}
			
			$processo->itens = $itens;
			
			
            $objetos[] = $processo;
		}
			return $objetos;
	}
	
	public function Salvar()
	{
		$resultado = $this->dao->Salvar( $this );
		return $resultado;
	}
	
	public function CarregarProcessosPorStatus( $servidor )
	{
			$resultado = $this->dao->CarregarProcessosPorStatus( $servidor );
			return $resultado;
	}

	static public function getServidorNivelAcesso( $servidorPerfil )
	{
		switch( $servidorPerfil )
      	{
      		case 0:
      			$statusMin = 0;
      			$statusMax = 33;
      			break;
      		case 1:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 2:
      			$statusMin = 0;
      			$statusMax = 0;
      			break;
      		case 3:
      			$statusMin = 1;
      			$statusMax = 1;
      			break;
      		case 4:
      			$statusMin = 3;
      			$statusMax = 33;
      			break;
      	}
      	
      	return array($statusMin, $statusMax);
	}
	
	
	
	/**
      Busca na tabela t_compra pelo registro associado � chave-prim�ria $id.
      Caso um registro seja encontrado ser� criada uma inst�ncia de Processo com os valores das colunas do registro em quest�o.
      @id - Chave-prim�ria do processo cadastrado no banco de dados.
      @return - Retorna um objeto Processo com as informa��es encontradas no registro. Caso n�o encontre nenhum resultado, retorna FALSE.
      */
      public function CarregarProcesso( $id )
      {
             $resultado = $this->dao->CarregarProcesso( $id );

             return $resultado;
      }
	

      
      
	  /**
      Altera um registro do processo na tabela t_compra.
      Internamente este m�todo utiliza a vari�vel $this para alterar as informa��es, logo, ser� alterado no banco de dados as informa��es do objeto que chamar este m�todo.
      @return - Retorna TRUE caso a opera��o seja efetuada com sucesso ou FALSE caso contr�rio.
      */
      public function Atualizar()
      {
             $resultado = $this->dao->Atualizar( $this );
             return $resultado;
      }
  
	public function CarregarProcessosPorCategoria( $categoriaId, $funcionario )
      {
      		$resultado = $this->dao->CarregarProcessosPorCategoria( $categoriaId, $funcionario );
      		return $resultado;
      }
      
	public function CarregarProcessosPorEspecificacao( $especificacao, $funcionario )
	  {
	  		$resultado = $this->dao->CarregarProcessosPorEspecificacao( $especificacao, $funcionario );
      		return $resultado;
	  }
      
	
	
	public function AvaliarEstrategiaContratacao( $modalidade, $fundamento, $justificativa )
	{
		$this->licitacao = $modalidade;
		$this->fundamentoLegal = $fundamento;
		$this->justificativa = $justificativa;
		if ( $this->status < 31)
			$this->status = 31;
		$this->dao->AvaliarEstrategiaContratacao($this, $modalidade, $fundamento, $justificativa);
	}
	
	public function CarregarProcessosPorServico( $servicoId, $funcionario )
	{
		$resultado = $this->dao->CarregarProcessosPorServico( $servicoId, $funcionario );
		return $resultado;
	}	

    public function RealizarDespacho( $responsavel, $avaliacao, $despacho )
    {
    	$resultado = $this->dao->RealizarDespacho( $this, $responsavel, $avaliacao, $despacho );
        return $resultado;
	}

	/**
      Carrega os processos vinculados ao funcionario que � passado por par�metro.
      @return Retorna um array de objetos do tipo Processo.
      */
      public function CarregarProcessosPorServidor( $servidor )
      {
             $resultado = $this->dao->CarregarProcessosPorServidor( $servidor );
             return $resultado;
      }

	/**
     Retorna informa��es sobre o status do processo.
     @return Retorna uma string indicando o estado atual do processo
    */
    public function getStatus()
    {
        switch( $this->status )
        {
        	case 0:
            	$status = "Processo Cadastrado. Aguardando aprova��o do diretor da sede.";
                break;
			case 1:
            	$status = "Aprovado pelo diretor da sede. Encaminhado ao DAP na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
			case 2:
            	$status = "Reprovado pelo diretor da sede na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 3:
            	$status = "Aprovado pelo DAP. Encaminhado ao setor de compras na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 31:
            	$status = "Aprovado pelo DAP. Encaminhado ao setor de compras na data: ".$this->despacho[count($this->despacho)-1]['data'];
            	break;
            case 32:
            	$status = "Aprovado pelo DAP. Encaminhado ao setor de compras na data: ".$this->despacho[count($this->despacho)-1]['data'];
            	break;
            case 33:
            	$status = "Aprovado pelo DAP. Encaminhado ao setor de compras na data: ".$this->despacho[count($this->despacho)-1]['data'];
            	break;
            case 4:
            	$status = "Reprovado pelo DAP na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 5:
            	$status = "Aprovado pelo setor de compras. Encaminhado ao setor de or�amento na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 6:
            	$status = "Reprovado pelo setor de compras na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 7:
            	$status = "Aprovado pelo setor de or�amento. Encaminhado para licita��o na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
            case 8:
            	$status = "Reprovado pelo setor de or�amento na data: ".$this->despacho[count($this->despacho)-1]['data'];
                break;
        }     
        return $status;
	}
	
	public function CalcularValorTotal()
	{
		$resultado = $this->dao->CalcularValorTotal( $this );
        return $resultado;
	}
	
	public function CarregarLicitacao( $licitacaoId )
	{
		$resultado = $this->dao->CarregarLicitacao( $licitacaoId );
        return $resultado;
	}
	
	public function VerificarStatus( $processoId )
	{
		$resultado = $this->dao->VerificarStatus( $processoId );
        return $resultado;
	} 
	
	public function CarregarLicitacoes()
	{
		$resultado = $this->dao->CarregarLicitacoes();
        return $resultado;
	}
      

}
?>
